Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/components/map/internal/markerStyles.js 5567022348aebbe4b6a1b5d7ea8d0fb04a3cacde (55670223) Text, 11.62 KB

T8b949e// SPDX-License-Identifier: 0BSD

T8b949e/**
* Pure OpenLayers marker style builders for the discovery map.
*
* Badge SVGs use a dual halo (dark outer plus light inner rim) so the same asset
* stays readable on both dark and light basemaps without theme branching.
*/

Tff7b72import Tb4b4b4{ Te6edf3StyleTb4b4b4, Te6edf3TextTb4b4b4, Te6edf3FillTb4b4b4, Te6edf3StrokeTb4b4b4, Te6edf3Circle Tff7b72as Te6edf3CircleStyleTb4b4b4, Te6edf3Icon Tb4b4b4} Tff7b72from Ta5d6ff"ol/style"Tb4b4b4;

T8b949e/** Default indigo face for peers without an LXMF user icon. */
Tff7b72export Tff7b72const Te6edf3DEFAULT_PEER_FACE Tff7b72= Ta5d6ff"#3730a3"Tb4b4b4;

T8b949e/** Default white glyph on peer badges. */
Tff7b72export Tff7b72const Te6edf3DEFAULT_PEER_GLYPH Tff7b72= Ta5d6ff"#ffffff"Tb4b4b4;

T8b949e/** Emerald face for discovered interface markers. */
Tff7b72export Tff7b72const Te6edf3DEFAULT_DISCOVERED_FACE Tff7b72= Ta5d6ff"#059669"Tb4b4b4;

T8b949e/** Fallback MDI-style map pin path (24x24 viewBox). */
Tff7b72export Tff7b72const Te6edf3DEFAULT_MAP_PIN_PATH Tff7b72=
Ta5d6ff"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7Zm0 11a2 2 0 1 1 0-4 2 2 0 0 1 0 4Z"Tb4b4b4;

T8b949e/** Show permanent name labels at or above this zoom. */
Tff7b72export Tff7b72const Te6edf3MARKER_LABEL_MIN_ZOOM Tff7b72= T79c0ff12Tb4b4b4;

T8b949e/** Normal badge Icon scale. */
Tff7b72export Tff7b72const Te6edf3BADGE_SCALE_NORMAL Tff7b72= T79c0ff1Tb4b4b4;

T8b949e/** Hovered badge Icon scale. */
Tff7b72export Tff7b72const Te6edf3BADGE_SCALE_HOVER Tff7b72= T79c0ff1.12Tb4b4b4;

Tff7b72const Te6edf3STALE_FACE Tff7b72= Ta5d6ff"#64748b"Tb4b4b4;
Tff7b72const Te6edf3STALE_GLYPH Tff7b72= Ta5d6ff"#e2e8f0"Tb4b4b4;

T8b949e/**
* Parse #rgb / #rrggbb into 0-1 linear-ish sRGB channels for luminance.
* @param {string} color
* @returns {{r:number,g:number,b:number}|null}
*/
Tff7b72function Te6edf3parseHexColorTb4b4b4(Te6edf3colorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3color Tff7b72!== Ta5d6ff"string"Tb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72let Te6edf3hex Tff7b72= Te6edf3colorTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hexTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"#"Tb4b4b4)Tb4b4b4) Te6edf3hex Tff7b72= Te6edf3hexTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hexTb4b4b4.Te6edf3length Tff7b72=== T79c0ff3Tb4b4b4) Tb4b4b4{
Te6edf3hex Tff7b72= Te6edf3hex
Tb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff""Tb4b4b4)
Tb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3c Tff7b72+ Te6edf3cTb4b4b4)
Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Ta5d6ff/^[0-9a-fA-F]{6}$/Tb4b4b4.Te6edf3testTb4b4b4(Te6edf3hexTb4b4b4)Tb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3rTff7b72: Tffa657parseIntTb4b4b4(Te6edf3hexTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4, T79c0ff16Tb4b4b4) Tff7b72/ T79c0ff255Tb4b4b4,
Te6edf3gTff7b72: Tffa657parseIntTb4b4b4(Te6edf3hexTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff2Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4, T79c0ff16Tb4b4b4) Tff7b72/ T79c0ff255Tb4b4b4,
Te6edf3bTff7b72: Tffa657parseIntTb4b4b4(Te6edf3hexTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff4Tb4b4b4, T79c0ff6Tb4b4b4)Tb4b4b4, T79c0ff16Tb4b4b4) Tff7b72/ T79c0ff255Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Relative luminance (WCAG-ish) for a hex color.
* @param {string} color
* @returns {number} 0-1, or 0.5 when unparseable
*/
Tff7b72export Tff7b72function Te6edf3relativeLuminanceTb4b4b4(Te6edf3colorTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3rgb Tff7b72= Te6edf3parseHexColorTb4b4b4(Te6edf3colorTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rgbTb4b4b4) Tff7b72return T79c0ff0.5Tb4b4b4;
Tff7b72const Te6edf3lin Tff7b72= Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Tb4b4b4(Te6edf3c Tff7b72<= T79c0ff0.03928 Tff7b72? Te6edf3c Tff7b72/ T79c0ff12.92 Tff7b72: Tb4b4b4(Tb4b4b4(Te6edf3c Tff7b72+ T79c0ff0.055Tb4b4b4) Tff7b72/ T79c0ff1.055Tb4b4b4) Tff7b72** T79c0ff2.4Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0.2126 Tff7b72* Te6edf3linTb4b4b4(Te6edf3rgbTb4b4b4.Te6edf3rTb4b4b4) Tff7b72+ T79c0ff0.7152 Tff7b72* Te6edf3linTb4b4b4(Te6edf3rgbTb4b4b4.Te6edf3gTb4b4b4) Tff7b72+ T79c0ff0.0722 Tff7b72* Te6edf3linTb4b4b4(Te6edf3rgbTb4b4b4.Te6edf3bTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Contrast ratio between two hex colors.
* @param {string} a
* @param {string} b
* @returns {number}
*/
Tff7b72export Tff7b72function Te6edf3contrastRatioTb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3L1 Tff7b72= Te6edf3relativeLuminanceTb4b4b4(Te6edf3aTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3L2 Tff7b72= Te6edf3relativeLuminanceTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3lighter Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(Te6edf3L1Tb4b4b4, Te6edf3L2Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3darker Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3L1Tb4b4b4, Te6edf3L2Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4(Te6edf3lighter Tff7b72+ T79c0ff0.05Tb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3darker Tff7b72+ T79c0ff0.05Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Pick a readable glyph color for a badge face.
* Prefers the preferred color when contrast against bg is at least 3 to 1.
* @param {string} bg
* @param {string} [preferred]
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3contrastGlyphColorTb4b4b4(Te6edf3bgTb4b4b4, Te6edf3preferredTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3white Tff7b72= Ta5d6ff"#ffffff"Tb4b4b4;
Tff7b72const Te6edf3ink Tff7b72= Ta5d6ff"#0f172a"Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3preferred Tff7b72&& Te6edf3contrastRatioTb4b4b4(Te6edf3preferredTb4b4b4, Te6edf3bgTb4b4b4) Tff7b72>= T79c0ff3Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3preferredTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3relativeLuminanceTb4b4b4(Te6edf3bgTb4b4b4) Tff7b72> T79c0ff0.45 Tff7b72? Te6edf3ink Tff7b72: Te6edf3whiteTb4b4b4;
Tb4b4b4}

T8b949e/**
* Whether a marker name label should render.
* @param {{zoom?:number, hovered?:boolean, selected?:boolean}} opts
* @returns {boolean}
*/
Tff7b72export Tff7b72function Te6edf3shouldShowMarkerLabelTb4b4b4(Tb4b4b4{ Te6edf3zoomTb4b4b4, Te6edf3hovered Tff7b72= Tff7b72falseTb4b4b4, Te6edf3selected Tff7b72= Tff7b72false Tb4b4b4} Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3hovered Tff7b72|| Te6edf3selectedTb4b4b4) Tff7b72return Tff7b72trueTb4b4b4;
Tff7b72return Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3zoomTb4b4b4) Tff7b72&& Te6edf3zoom Tff7b72>= Te6edf3MARKER_LABEL_MIN_ZOOMTb4b4b4;
Tb4b4b4}

T8b949e/**
* Encode an SVG markup string as a data URL for ol/style/Icon.
* @param {string} svg
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3encodeSvgDataUrlTb4b4b4(Te6edf3svgTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3bytes Tff7b72= Tff7b72new Te6edf3TextEncoderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3encodeTb4b4b4(Te6edf3svgTb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3binary Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3chunk Tff7b72= T79c0ff0x8000Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3bytesTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3i Tff7b72+= Te6edf3chunkTb4b4b4) Tb4b4b4{
Te6edf3binary Tff7b72+= Tffa657StringTb4b4b4.Te6edf3fromCharCodeTb4b4b4(Tb4b4b4...Te6edf3bytesTb4b4b4.Te6edf3subarrayTb4b4b4(Te6edf3iTb4b4b4, Te6edf3i Tff7b72+ Te6edf3chunkTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"data:image/svg+xml;base64," Tff7b72+ Te6edf3btoaTb4b4b4(Te6edf3binaryTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Build dual-halo peer / discovered badge SVG markup.
* @param {{face:string, glyph:string, pathD?:string, stale?:boolean, tracking?:boolean}} opts
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3buildPeerBadgeSvgTb4b4b4(Tb4b4b4{ Te6edf3faceTb4b4b4, Te6edf3glyphTb4b4b4, Te6edf3pathD Tff7b72= Te6edf3DEFAULT_MAP_PIN_PATHTb4b4b4, Te6edf3stale Tff7b72= Tff7b72falseTb4b4b4, Te6edf3tracking Tff7b72= Tff7b72false Tb4b4b4} Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3faceColor Tff7b72= Te6edf3stale Tff7b72? Te6edf3STALE_FACE Tff7b72: Te6edf3face Tff7b72|| Te6edf3DEFAULT_PEER_FACETb4b4b4;
Tff7b72const Te6edf3glyphColor Tff7b72= Te6edf3stale Tff7b72? Te6edf3STALE_GLYPH Tff7b72: Te6edf3glyph Tff7b72|| Te6edf3DEFAULT_PEER_GLYPHTb4b4b4;
Tff7b72const Te6edf3opacity Tff7b72= Te6edf3stale Tff7b72? Ta5d6ff"0.72" Tff7b72: Ta5d6ff"1"Tb4b4b4;
Tff7b72const Te6edf3showPulse Tff7b72= Te6edf3tracking Tff7b72&& Tff7b72!Te6edf3staleTb4b4b4;
Tff7b72const Te6edf3size Tff7b72= Te6edf3showPulse Tff7b72? T79c0ff48 Tff7b72: T79c0ff40Tb4b4b4;
Tff7b72const Te6edf3cx Tff7b72= Te6edf3size Tff7b72/ T79c0ff2Tb4b4b4;
Tff7b72const Te6edf3cy Tff7b72= Te6edf3size Tff7b72/ T79c0ff2Tb4b4b4;
Tff7b72const Te6edf3r Tff7b72= Te6edf3showPulse Tff7b72? T79c0ff12 Tff7b72: T79c0ff11Tb4b4b4;

Tff7b72const Te6edf3pulse Tff7b72= Te6edf3showPulse
Tff7b72? Ta5d6ff`Ta5d6ff<circle cx="Tffd700${Te6edf3cxTffd700}Ta5d6ff" cy="Tffd700${Te6edf3cyTffd700}Ta5d6ff" r="Tffd700${Te6edf3rTffd700}Ta5d6ff" fill="none" stroke="#38bdf8" stroke-width="2">
<animate attributeName="r" from="Tffd700${Te6edf3rTffd700}Ta5d6ff" to="Tffd700${Te6edf3r Tff7b72+ T79c0ff8Tffd700}Ta5d6ff" dur="1.5s" repeatCount="indefinite" />
<animate attributeName="stroke-opacity" from="0.9" to="0" dur="1.5s" repeatCount="indefinite" />
</circle>
<circle cx="Tffd700${Te6edf3cxTffd700}Ta5d6ff" cy="Tffd700${Te6edf3cyTffd700}Ta5d6ff" r="Tffd700${Te6edf3r Tff7b72- T79c0ff1Tffd700}Ta5d6ff" fill="#38bdf8" fill-opacity="0.18">
<animate attributeName="r" from="Tffd700${Te6edf3r Tff7b72- T79c0ff2Tffd700}Ta5d6ff" to="Tffd700${Te6edf3r Tff7b72+ T79c0ff3Tffd700}Ta5d6ff" dur="1.5s" repeatCount="indefinite" />
<animate attributeName="fill-opacity" from="0.22" to="0" dur="1.5s" repeatCount="indefinite" />
</circle>Ta5d6ff`
Tff7b72: Ta5d6ff""Tb4b4b4;

T8b949e// Dual halo is dark outer rim plus light inner rim then face fill then glyph.
Tff7b72return Ta5d6ff`Ta5d6ff<svg xmlns="http://www.w3.org/2000/svg" width="Tffd700${Te6edf3sizeTffd700}Ta5d6ff" height="Tffd700${Te6edf3sizeTffd700}Ta5d6ff" viewBox="0 0 Tffd700${Te6edf3sizeTffd700}Ta5d6ff Tffd700${Te6edf3sizeTffd700}Ta5d6ff">
<g opacity="Tffd700${Te6edf3opacityTffd700}Ta5d6ff">
<circle class="badge-shadow" cx="Tffd700${Te6edf3cx Tff7b72+ T79c0ff0.6Tffd700}Ta5d6ff" cy="Tffd700${Te6edf3cy Tff7b72+ T79c0ff1.1Tffd700}Ta5d6ff" r="Tffd700${Te6edf3r Tff7b72+ T79c0ff1Tffd700}Ta5d6ff" fill="rgba(15,23,42,0.28)"/>
Tffd700${Te6edf3pulseTffd700}
Ta5d6ff <circle class="badge-rim-dark" cx="Tffd700${Te6edf3cxTffd700}Ta5d6ff" cy="Tffd700${Te6edf3cyTffd700}Ta5d6ff" r="Tffd700${Te6edf3rTffd700}Ta5d6ff" fill="Tffd700${Te6edf3faceColorTffd700}Ta5d6ff" stroke="rgba(15,23,42,0.78)" stroke-width="3"/>
<circle class="badge-rim-light" cx="Tffd700${Te6edf3cxTffd700}Ta5d6ff" cy="Tffd700${Te6edf3cyTffd700}Ta5d6ff" r="Tffd700${Te6edf3rTffd700}Ta5d6ff" fill="none" stroke="rgba(255,255,255,0.92)" stroke-width="1.6"/>
<g transform="translate(Tffd700${Te6edf3cxTffd700}Ta5d6ff,Tffd700${Te6edf3cyTffd700}Ta5d6ff) scale(0.52) translate(-12,-12)">
<path d="Tffd700${Te6edf3pathDTffd700}Ta5d6ff" fill="Tffd700${Te6edf3glyphColorTffd700}Ta5d6ff"/>
</g>
</g>
/svg>Ta5d6ff`Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Create an OpenLayers Style for a peer / discovered / note badge.
* @param {object} opts
* @param {string} [opts.face]
* @param {string} [opts.glyph]
* @param {string} [opts.iconColor] preferred glyph (legacy name from MapPage)
* @param {string} [opts.bgColor] face (legacy name from MapPage)
* @param {string} [opts.pathD]
* @param {string} [opts.iconPath] alias for pathD
* @param {string} [opts.label]
* @param {boolean} [opts.showLabel]
* @param {boolean} [opts.isStale]
* @param {boolean} [opts.isTracking]
* @param {number} [opts.scale]
* @returns {import("ol/style/Style").default}
*/
Tff7b72export Tff7b72function Te6edf3peerBadgeStyleTb4b4b4(Tb4b4b4{
Te6edf3faceTb4b4b4,
Te6edf3glyphTb4b4b4,
Te6edf3iconColorTb4b4b4,
Te6edf3bgColorTb4b4b4,
Te6edf3pathDTb4b4b4,
Te6edf3iconPathTb4b4b4,
Te6edf3label Tff7b72= Ta5d6ff""Tb4b4b4,
Te6edf3showLabel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isStale Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isTracking Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3scale Tff7b72= Te6edf3BADGE_SCALE_NORMALTb4b4b4,
Tb4b4b4} Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3resolvedFace Tff7b72= Te6edf3face Tff7b72|| Te6edf3bgColor Tff7b72|| Te6edf3DEFAULT_PEER_FACETb4b4b4;
Tff7b72const Te6edf3preferredGlyph Tff7b72= Te6edf3glyph Tff7b72|| Te6edf3iconColor Tff7b72|| Te6edf3DEFAULT_PEER_GLYPHTb4b4b4;
Tff7b72const Te6edf3resolvedGlyph Tff7b72= Te6edf3isStale Tff7b72? Te6edf3STALE_GLYPH Tff7b72: Te6edf3contrastGlyphColorTb4b4b4(Te6edf3resolvedFaceTb4b4b4, Te6edf3preferredGlyphTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3d Tff7b72= Te6edf3pathD Tff7b72|| Te6edf3iconPath Tff7b72|| Te6edf3DEFAULT_MAP_PIN_PATHTb4b4b4;

Tff7b72const Te6edf3svg Tff7b72= Te6edf3buildPeerBadgeSvgTb4b4b4(Tb4b4b4{
Te6edf3faceTff7b72: Te6edf3resolvedFaceTb4b4b4,
Te6edf3glyphTff7b72: Te6edf3resolvedGlyphTb4b4b4,
Te6edf3pathDTff7b72: Te6edf3dTb4b4b4,
Te6edf3staleTff7b72: Te6edf3isStaleTb4b4b4,
Te6edf3trackingTff7b72: Te6edf3isTrackingTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3src Tff7b72= Te6edf3encodeSvgDataUrlTb4b4b4(Te6edf3svgTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3renderSize Tff7b72= Te6edf3isTracking Tff7b72&& Tff7b72!Te6edf3isStale Tff7b72? T79c0ff48 Tff7b72: T79c0ff40Tb4b4b4;
Tff7b72const Te6edf3displayHeight Tff7b72= Te6edf3renderSize Tff7b72* Te6edf3scaleTb4b4b4;
Tff7b72const Te6edf3labelOffset Tff7b72= Tff7b72-Tb4b4b4(Te6edf3displayHeight Tff7b72/ T79c0ff2 Tff7b72+ T79c0ff8Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3styleOpts Tff7b72= Tb4b4b4{
Te6edf3imageTff7b72: Tff7b72new Te6edf3IconTb4b4b4(Tb4b4b4{
Te6edf3srcTb4b4b4,
Te6edf3anchorTff7b72: Tb4b4b4[T79c0ff0.5Tb4b4b4, T79c0ff0.5Tb4b4b4]Tb4b4b4,
Te6edf3scaleTb4b4b4,
Te6edf3imgSizeTff7b72: Tb4b4b4[Te6edf3renderSizeTb4b4b4, Te6edf3renderSizeTb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3showLabel Tff7b72&& Te6edf3labelTb4b4b4) Tb4b4b4{
Te6edf3styleOptsTb4b4b4.Te6edf3text Tff7b72= Tff7b72new Te6edf3TextTb4b4b4(Tb4b4b4{
Te6edf3textTff7b72: Tffa657StringTb4b4b4(Te6edf3labelTb4b4b4)Tb4b4b4,
Te6edf3offsetYTff7b72: Te6edf3labelOffsetTb4b4b4,
Te6edf3fontTff7b72: Ta5d6ff"bold 12px sans-serif"Tb4b4b4,
Te6edf3fillTff7b72: Tff7b72new Te6edf3FillTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Te6edf3isStale Tff7b72? Ta5d6ff"#6b7280" Tff7b72: Ta5d6ff"#111827" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3strokeTff7b72: Tff7b72new Te6edf3StrokeTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Ta5d6ff"#ffffff"Tb4b4b4, Te6edf3widthTff7b72: T79c0ff3 Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Tff7b72new Te6edf3StyleTb4b4b4(Te6edf3styleOptsTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Cluster size / color band for a marker count.
* @param {number} count
* @returns {{bandId:string, radius:number, face:string}}
*/
Tff7b72export Tff7b72function Te6edf3clusterBandTb4b4b4(Te6edf3countTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3n Tff7b72= Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3countTb4b4b4) Tff7b72? Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3countTb4b4b4)Tb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72< T79c0ff10Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3bandIdTff7b72: Ta5d6ff"s"Tb4b4b4, Te6edf3radiusTff7b72: T79c0ff16Tb4b4b4, Te6edf3faceTff7b72: Ta5d6ff"#2563eb" Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72< T79c0ff50Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3bandIdTff7b72: Ta5d6ff"m"Tb4b4b4, Te6edf3radiusTff7b72: T79c0ff20Tb4b4b4, Te6edf3faceTff7b72: Ta5d6ff"#7c3aed" Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{ Te6edf3bandIdTff7b72: Ta5d6ff"l"Tb4b4b4, Te6edf3radiusTff7b72: T79c0ff24Tb4b4b4, Te6edf3faceTff7b72: Ta5d6ff"#c2410c" Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Dual-halo cluster badge as layered OpenLayers styles (no SVG encode).
* @param {{count:number, hovered?:boolean}} opts
* @returns {import("ol/style/Style").default[]}
*/
Tff7b72export Tff7b72function Te6edf3clusterBadgeStyleTb4b4b4(Tb4b4b4{ Te6edf3count Tff7b72= T79c0ff0Tb4b4b4, Te6edf3hovered Tff7b72= Tff7b72false Tb4b4b4} Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3band Tff7b72= Te6edf3clusterBandTb4b4b4(Te6edf3countTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3radius Tff7b72= Te6edf3hovered Tff7b72? Te6edf3bandTb4b4b4.Te6edf3radius Tff7b72+ T79c0ff2 Tff7b72: Te6edf3bandTb4b4b4.Te6edf3radiusTb4b4b4;
Tff7b72const Te6edf3label Tff7b72= Tffa657StringTb4b4b4(Te6edf3countTb4b4b4)Tb4b4b4;

Tff7b72return Tb4b4b4[
Tff7b72new Te6edf3StyleTb4b4b4(Tb4b4b4{
Te6edf3imageTff7b72: Tff7b72new Te6edf3CircleStyleTb4b4b4(Tb4b4b4{
Te6edf3radiusTff7b72: Te6edf3radius Tff7b72+ T79c0ff2.5Tb4b4b4,
Te6edf3fillTff7b72: Tff7b72new Te6edf3FillTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Ta5d6ff"rgba(15, 23, 42, 0.32)" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3strokeTff7b72: Tff7b72new Te6edf3StrokeTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Ta5d6ff"rgba(15, 23, 42, 0.55)"Tb4b4b4, Te6edf3widthTff7b72: T79c0ff2 Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3zIndexTff7b72: T79c0ff0Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tff7b72new Te6edf3StyleTb4b4b4(Tb4b4b4{
Te6edf3imageTff7b72: Tff7b72new Te6edf3CircleStyleTb4b4b4(Tb4b4b4{
Te6edf3radiusTb4b4b4,
Te6edf3fillTff7b72: Tff7b72new Te6edf3FillTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Te6edf3bandTb4b4b4.Te6edf3face Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3strokeTff7b72: Tff7b72new Te6edf3StrokeTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Ta5d6ff"#ffffff"Tb4b4b4, Te6edf3widthTff7b72: T79c0ff2.5 Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3textTff7b72: Tff7b72new Te6edf3TextTb4b4b4(Tb4b4b4{
Te6edf3textTff7b72: Te6edf3labelTb4b4b4,
Te6edf3fontTff7b72: Ta5d6ff"bold 13px sans-serif"Tb4b4b4,
Te6edf3fillTff7b72: Tff7b72new Te6edf3FillTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Ta5d6ff"#ffffff" Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3strokeTff7b72: Tff7b72new Te6edf3StrokeTb4b4b4(Tb4b4b4{ Te6edf3colorTff7b72: Ta5d6ff"rgba(15,23,42,0.45)"Tb4b4b4, Te6edf3widthTff7b72: T79c0ff2 Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3zIndexTff7b72: T79c0ff1Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Cache-aware cluster style helper.
* @param {Record<string, import("ol/style/Style").default[]>} cache
* @param {{count:number, hovered?:boolean}} opts
* @returns {import("ol/style/Style").default[]}
*/
Tff7b72export Tff7b72function Te6edf3getCachedClusterStyleTb4b4b4(Te6edf3cacheTb4b4b4, Tb4b4b4{ Te6edf3count Tff7b72= T79c0ff0Tb4b4b4, Te6edf3hovered Tff7b72= Tff7b72false Tb4b4b4} Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3band Tff7b72= Te6edf3clusterBandTb4b4b4(Te6edf3countTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3key Tff7b72= Ta5d6ff`Ta5d6ffcluster-v2-Tffd700${Te6edf3bandTb4b4b4.Te6edf3bandIdTffd700}Ta5d6ff-Tffd700${Te6edf3countTffd700}Ta5d6ff-Tffd700${Te6edf3hovered Tff7b72? Ta5d6ff"h" Tff7b72: Ta5d6ff"n"Tffd700}Ta5d6ff`Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cacheTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4) Tff7b72return Te6edf3cacheTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3style Tff7b72= Te6edf3clusterBadgeStyleTb4b4b4(Tb4b4b4{ Te6edf3countTb4b4b4, Te6edf3hovered Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3cacheTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3styleTb4b4b4;
Tff7b72return Te6edf3styleTb4b4b4;
Tb4b4b4}

T8b949e/**
* Cache-aware peer badge style helper.
* @param {Record<string, import("ol/style/Style").default>} cache
* @param {object} opts
* @returns {import("ol/style/Style").default}
*/
Tff7b72export Tff7b72function Te6edf3getCachedPeerBadgeStyleTb4b4b4(Te6edf3cacheTb4b4b4, Te6edf3opts Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Tb4b4b4{
Te6edf3faceTb4b4b4,
Te6edf3glyphTb4b4b4,
Te6edf3iconColorTb4b4b4,
Te6edf3bgColorTb4b4b4,
Te6edf3pathDTb4b4b4,
Te6edf3iconPathTb4b4b4,
Te6edf3label Tff7b72= Ta5d6ff""Tb4b4b4,
Te6edf3showLabel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isStale Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isTracking Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3scale Tff7b72= Te6edf3BADGE_SCALE_NORMALTb4b4b4,
Tb4b4b4} Tff7b72= Te6edf3optsTb4b4b4;
Tff7b72const Te6edf3resolvedFace Tff7b72= Te6edf3face Tff7b72|| Te6edf3bgColor Tff7b72|| Te6edf3DEFAULT_PEER_FACETb4b4b4;
Tff7b72const Te6edf3preferredGlyph Tff7b72= Te6edf3glyph Tff7b72|| Te6edf3iconColor Tff7b72|| Te6edf3DEFAULT_PEER_GLYPHTb4b4b4;
Tff7b72const Te6edf3resolvedGlyph Tff7b72= Te6edf3isStale Tff7b72? Te6edf3STALE_GLYPH Tff7b72: Te6edf3contrastGlyphColorTb4b4b4(Te6edf3resolvedFaceTb4b4b4, Te6edf3preferredGlyphTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3d Tff7b72= Te6edf3pathD Tff7b72|| Te6edf3iconPath Tff7b72|| Te6edf3DEFAULT_MAP_PIN_PATHTb4b4b4;
Tff7b72const Te6edf3labelKey Tff7b72= Te6edf3showLabel Tff7b72&& Te6edf3label Tff7b72? Tffa657StringTb4b4b4(Te6edf3labelTb4b4b4) Tff7b72: Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3key Tff7b72= Tb4b4b4[
Ta5d6ff"peer-v2"Tb4b4b4,
Te6edf3resolvedFaceTb4b4b4,
Te6edf3resolvedGlyphTb4b4b4,
Te6edf3dTb4b4b4,
Te6edf3labelKeyTb4b4b4,
Te6edf3showLabel Tff7b72? Ta5d6ff"1" Tff7b72: Ta5d6ff"0"Tb4b4b4,
Te6edf3isStale Tff7b72? Ta5d6ff"1" Tff7b72: Ta5d6ff"0"Tb4b4b4,
Te6edf3isTracking Tff7b72? Ta5d6ff"1" Tff7b72: Ta5d6ff"0"Tb4b4b4,
Te6edf3scaleTb4b4b4,
Tb4b4b4]Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"|"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cacheTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4) Tff7b72return Te6edf3cacheTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3style Tff7b72= Te6edf3peerBadgeStyleTb4b4b4(Tb4b4b4{
Te6edf3faceTff7b72: Te6edf3resolvedFaceTb4b4b4,
Te6edf3glyphTff7b72: Te6edf3resolvedGlyphTb4b4b4,
Te6edf3pathDTff7b72: Te6edf3dTb4b4b4,
Te6edf3labelTb4b4b4,
Te6edf3showLabelTb4b4b4,
Te6edf3isStaleTb4b4b4,
Te6edf3isTrackingTb4b4b4,
Te6edf3scaleTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3cacheTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3styleTb4b4b4;
Tff7b72return Te6edf3styleTb4b4b4;
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────